package com.fpj.sat.vehicle_administrator.dao.impl;

import java.sql.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.fpj.sat.vehicle_administrator.dao.VehiculoDao;
import com.fpj.sat.vehicle_administrator.domain.Correo;
import com.fpj.sat.vehicle_administrator.domain.RegistroVehiculo;
import com.fpj.sat.vehicle_administrator.domain.Vehiculo;

@Repository
public class VehiculoDaoImpl implements VehiculoDao{
	
	private EntityManager em;
	
	@PersistenceContext
	public void setEntityManager(EntityManager em){
		this.em = em;
	}
	
	@Transactional(readOnly=true)
	public List<RegistroVehiculo> listarRegistros(Date fechaInicio, Date fechaFin, int idUsuario) {
		StringBuilder JPQL = new StringBuilder();
		JPQL.append("select rv from com.fpj.sat.vehicle_administrator.domain.RegistroVehiculo rv join fetch rv.usuarioBean u where u.id = :idUsuario ");
		if(fechaInicio != null && fechaFin != null){
			JPQL.append(" and date(rv.fechaRegistro) between :fechaIni and :fechaFin ");
		}
				
		TypedQuery<RegistroVehiculo> query = em.createQuery(JPQL.toString(), RegistroVehiculo.class);
		query.setParameter("idUsuario", idUsuario);
		if(fechaInicio != null && fechaFin != null){
			query.setParameter("fechaIni", fechaInicio);
			query.setParameter("fechaFin", fechaFin);
		}
		return query.getResultList();
	}
	
	@Transactional(readOnly=false)
	public void grabarRegistro(RegistroVehiculo registroVehiculo) {
		em.persist(registroVehiculo);
	}
	
	@Transactional(readOnly=false)
	public void actualizarRegistro(RegistroVehiculo registroVehiculo) {
		em.merge(registroVehiculo);
	}

	@Transactional(readOnly=true)
	public List<Vehiculo> listarVehiculos(int idRegistro) {
		StringBuilder JPQL = new StringBuilder();
		JPQL.append("select v from com.fpj.sat.vehicle_administrator.domain.Vehiculo v join fetch v.registroVehiculo rv where rv.id = :idRegistro ");
		TypedQuery<Vehiculo> query = em.createQuery(JPQL.toString(), Vehiculo.class);
		query.setParameter("idRegistro", idRegistro);
		
		return query.getResultList();
	}

	@Transactional(readOnly=false)
	public void grabarVehiculo(Vehiculo vehiculo) {
		em.persist(vehiculo);
	}

	@Transactional(readOnly=false)
	public void actualizarVehiculo(Vehiculo vehiculo) {
		em.merge(vehiculo);
	}

	@Transactional(readOnly=false)
	public void registrarCorreo(Correo correo) {
		em.persist(correo);
	}

	@Transactional(readOnly=true)
	public List<Correo> getCorreos(String tipo) {
		StringBuilder JPQL = new StringBuilder();
		JPQL.append("select c from com.fpj.sat.vehicle_administrator.domain.Correo c where c.tipo = :tipo ");
		TypedQuery<Correo> query = em.createQuery(JPQL.toString(), Correo.class);
		query.setParameter("tipo", tipo);
		
		return query.getResultList();
	}
	
	

}
